"""
浅拷贝与深拷贝
    # 直接赋值：对象的引用（别名），不产生拷贝。
    # 浅拷贝：拷贝父对象，不会拷贝对象的内部的子对象。拷贝后只有第一层是独立的。
    # 深拷贝：完全拷贝了父对象及其子对象。拷贝后所有层都是独立的。
拷贝的特殊情况
    # 非容器类型（如数字、字符串、和其他“原子”类型的对象）无法拷贝
    # 元组变量如果只包含原子类型对象，则不能对其深拷贝

如何浅拷贝
    # 使用 copy 模块的 deepcopy() 函数。
"""

# 创建一个列表，其中包含整型和列表元素，使用 deepcopy() 对其深拷贝。使用 id() 查看列表地址和列表中各个元素的地址。

import copy

list1 = [1, 2, 3, [100, 200, 300]]
print(id(list1), id(list1[0]), id(list1[1]), id(list1[2]), id(list1[3]), list1)
# 4370135872 4391414360 4391414392 4391414424 4369975616 [1, 2, 3, [100, 200, 300]]
# 执行深拷贝
list3 = copy.deepcopy(list1)
print(id(list3), id(list3[0]), id(list3[1]), id(list3[2]), id(list3[3]), list3)
# 4371164096 4391414360 4391414392 4391414424 4371164288 [1, 2, 3, [100, 200, 300]]

# 可以看到拷贝后，新的列表地址与列表中各个可变类型元素的地址都发生了改变，不可变类型元素拷贝后地址不变。

#########################################
# 修改深拷贝后的列表，观察对原列表的影响。
list3[0] = 111
list3[3][0] = 999
print(id(list1), id(list1[0]), id(list1[1]), id(list1[2]), id(list1[3]), list1)
# 4368612160 4389595736 4389595768 4389595800 4368451904 [1, 2, 3, [100, 200, 300]]
print(id(list3), id(list3[0]), id(list3[1]), id(list3[2]), id(list3[3]), list3)
# 4369640384 4389599256 4389595768 4389595800 4369640576 [111, 2, 3, [999, 200, 300]]

# 可以看到 list3[0] 为不可变类型元素，因此可以看到 list3[0] 指向了新的引用。
# 可以看到 list3[3] 为可变类型元素，修改不会影响原列表。